<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="/js/prism.css">
    <link rel="stylesheet" href="/css/app.css">
    <title>Panda-api接口权限配置说明 - 叫兽</title>
    <link rel="icon" type="image/x-icon" class="js-site-favicon" href="/img/favicon.ico">
  </head>
  <body>

        <div class="container bg-white pb-5 px-5 spx-0">
            
            <h1 class="post-title">Panda-api接口权限配置说明</h1>




            <p>一个系统，通常会涉及不同的权限和用户角色，每一种角色对接口的<code>增</code>、<code>删</code>、<code>改</code>、<code>查</code>的权限是不一样的，或者对同一个接口地址的请求方法<code>GET</code>、<code>POST</code>、<code>PUT</code>、<code>DELETE</code>的权限也会有不同，Panda Api在设计的时候很好的兼容了这些情况。下面我们用例子来进行说明：</p><p>首先，在我们的项目接口文档目录的根目录下创建<code>&#95;auth.json5</code>文件，该文件和<code>&#95;settings.json5</code>在同一级目录。</p><p><code>注意：</code> 只有接口文档中<code>auth:true</code>的情况下，Panda Api才会对接口进行权限验证，如果<code>auth:false</code>，那么会跳过auth验证。你可以在接口文档中设置，也可以在<code>&#95;settings.json5</code>中进行全局开启，然后在不需要权限验证的接口的地方再单独关闭。例如：</p><pre><code class=".language-json5">// &#95;settings.json5
{
  project&#95;name: &quot;Panda Api&quot;,
  project&#95;desc: &quot;Panda api is a simple api manage tool&quot;,
  global: {
    apis: {
      auth: true
    }
  }
}
</code></pre><p>我们先写一个最简单的权限配置，超级管理员，拥有所有接口的权限配置。编辑<code>&#95;auth.json5</code>文件：<pre><code class=".language-json5">// &#95;auth.json5
{
    name: &quot;用户认证接口文档&quot;,
    desc: &quot;相关auth认证说明，token生成规则及相关说明&quot;,
    auth&#95;type:&quot;Bearer&quot;, // Authentication type, default is Bearer
    auth&#95;place:&quot;headers&quot;, // Add authorization data to headers, body, query. default is heaeders
    no&#95;perm&#95;response: {
        code: -1,
        msg: &quot;没有权限非法操作&quot;
    },
    // 没有权限的或者没有token的就返回 no&#95;perem&#95;response中的内容
    groups:&#91; // 表示拥有不同权限的用户组列表
    {
        name: &quot;超级管理员&quot;,
        desc: &quot;拥有全部的权限&quot;,
        users:&#91; // 拥有权限的用户列表
        {
            id:1,
            username:&quot;root&quot;,
            password:&quot;123321&quot;,
            token:&quot;9&#41;N2Ck&#42;&#126;nB1tMj3le7dstcX3ymfM3LqB6y!Kk!NZlg91&#40;st&amp;EY&#126;etZN1&#40;&#41;vU&quot;,
        }
        &#93;,
        no&#95;perms:&#91;&#91;&quot;/admin/user/&quot;, &quot;DELETE&quot;&#93;&#93;, // 表示没有权限的列表，没有权限列表优先
        has&#95;perms:&#91;&quot;&#42;&quot;&#93;, // &#42;星号表示拥有所有接口的全部权限
        no&#95;perm&#95;response: {
            code: -1,
            msg: &quot;没有用户删除的权限&quot;
        }
    }
    &#93;
}
</code></pre></p><p>这个文档表示：用户root，token是<code>9&#41;N2Ck&#42;&#126;nB1tMj3le7dstcX3ymfM3LqB6y!Kk!NZlg91&#40;st&amp;EY&#126;etZN1&#40;&#41;vU</code>，他拥有全部的接口访问权限，除了<code>/admin/user/</code>这个接口的<code>DELETE</code>请求方法。</p><h2>auth_type</h2><p>表示Authentication类型，默认是Bearer</p><h2>auth_place</h2><p>表示token放的位置，可以放到headers,body或者query，默认是headers</p><h2>no_perm_response</h2><p>表示没有权限时返回的错误内容，可以在根节点，全局设置一个，然后所有groups列表中的权限都会继承，groups中的权限也可以重写自己的no_perm_response，如果都没有设置，系统在遇到没有权限的时候，会返回：<pre><code class=".language-json">{
    &quot;code&quot;:-1,
    &quot;error&quot;:&quot;no perm to visit&quot;
}
</code></pre></p><h2>groups</h2><p>表示拥有各种不同权限的用户组列表</p><p>在<code>groups</code>的元素中，<code>name</code>表示用户组的名称，<code>desc</code>表示对这个用户组及拥有权限的说明，</p><p><code>users</code>这个用户组拥有哪些用户，用户里面的字段是可以根据需要任意设置的（比如登录需要用户名和密码；手机号；OpenID等)，但是一定要有<code>token</code>字段，表示这个用户的<code>auth token</code></p><h2>no_perms</h2><p>表示这个用户组的用户对哪些接口没有权限，这个权限是优先于<code>has&#95;perms</code>，也就是这只在这里的权限，就算<code>has&#95;perms</code>里面设置了有权限也无效。</p><h2>has_perms</h2><p>表示这个用户组的用户对哪些接口有权限，</p><h2>权限的写法</h2><p>no_perms和has_perms的权限写法是一样的，他们有这些写法：</p><ul><li><code>has&#95;perms:&#91;&quot;&#42;&quot;&#93;</code>   ：<code>&#42;</code>英文的星号有所有接口的所有请求方法权限, 你也可以这么写<code>has&#95;perms:&#91;&#91;&quot;&#42;&quot;, &quot;&#42;&quot;&#93;&#93;</code></li><li><code>has&#95;perms:&#91;&quot;/admin/settings/&quot;, &#91;&quot;/admin/user/&quot;, &quot;DELETE&quot;, &quot;GET&quot;, &quot;POST&quot;&#93;, &#91;&quot;/admin/post/&quot;, &quot;POST&quot;&#93;, &#91;&quot;/admin/news/&quot;, &quot;&#42;&quot;&#93;&#93;</code>   ：拥有<code>/admin/settings/</code>的所有请求方法权限；    对<code>/admin/user/</code>拥有 <code>DELETE</code>, <code>GET</code>, <code>POST</code> 方法权限；    对<code>/admin/post/</code> 只有 <code>POST</code>权限；   对<code>/admin/news/</code>拥有所有请求方法权限；</li></ul><p>当你直接写一个字符串的url地址的时候，默认表示拥有了所有请求方法权限。比如例子中：<code>/admin/settings/</code>的完整写法其实是：<code>has&#95;perms:&#91;&#91;&quot;/admin/settings/&quot;, &quot;&#42;&quot;&#93;&#93;</code></p><p>当你用数组表示的时候，第一个元素表示请求地址，后面的所有元素表示这个地址包含的请求方法。</p><p>你还可以使用第三种写法：</p><pre><code class=".language-json5">has&#95;perms:&#91;
    {
        url: &quot;/admin/user/&quot;,
        methods:&#91;&quot;DELETE&quot;, &quot;GET&quot;, &quot;POST&quot;&#93;
    },
    {
        url: &quot;/admin/post/&quot;,
        methods:&#91;&quot;POST&quot;&#93;
    },
    {
        url: &quot;/admin/news/&quot;,
        methods:&#91;&quot;&#42;&quot;&#93;
    }
&#93;

</code></pre><h2>以接口文档作为权限加载</h2><p>因为如果要一个接口一个接口的写，可能会导致工作量很大，而且有的接口文档的接口地址还在不停的修改，所以又设计了直接以接口文档为加载。例如：</p><pre><code class=".language-json5">has&#95;perms:&#91;&quot;$article.json5&quot;, &#91;&quot;$auth.json5&quot;, &quot;GET&quot;&#93;&#93;,
no&#95;perms:&#91;&#91;&quot;/admin/user/&quot;, &quot;DELETE&quot;&#93;&#93;,
</code></pre><p><code>has&#95;perms</code>表示拥有<code>article.json5</code>接口文档中的所有接口的所有请求方法权限，拥有<code>auth.json5</code>接口文档中所有接口的<code>GET</code>权限。</p><p><code>no&#95;perms</code> 表示出了<code>/admin/user/</code> 的<code>DELETE</code>权限没有</p><p><code>$</code>英文的美元符号后面，跟的是接口文件的相对地址。</p><h2>创建token</h2><p>当你用很多用户组权限，也有很多用户，你可能无法自己编出很多的符合前后端约定的token，Panda api的命令提供了token生成的简单方法。</p><p>这里以mac下安装好Panda api举例，在shell中执行命令<code>panda -t 60</code></p><pre><code class=".language-shell">panda -t 60
Prw$nMQT5&#126;du8DF$#grOtosaFIQ!WeOTK@2&#40;tZlep9ZX1lNK%PHINam8jsAz
&#126;L2L59xX@gy&#42;!vAVeOH&#42;%0ImNdF9&#94;1&#40;5QL4&#126;BgcRFPsSvfe$4iCTEq8GWABa
H&#126;p&#126;!wWLHjUFPLj0Uu4W3wZ#H!4%4&#41;&#42;zjZd&#42;y$Dq4Yg&#42;sdtI7jEgfG&amp;o2gG$
63ugo3y6g&#94;NAgM&#40;nrZlhwXmabW#w6l&amp;O&amp;3#r&#94;9uTz1Ep&amp;Ox7DyxVx&amp;AH10An
!7A7HE!0&#126;yTbgK3qvzZksUgsRAfPeezBqGP0L$$bC!@WtQt&#41;MFJuQv937m&#126;!
rvD5VbW&#40;$bvh8M3ci5Nq!&#94;C1Aotu4gCn&#40;j$&#41;&#40;&#42;wQisLXIAigUM9zNQk5S&#94;I0
FlI$SvZEdfsb2whh6r0F%gbYPZ3EyP!xzpTWvVfc#h4FYStYse4BNjC%8b&#41;&#94;
cKT8Nd76z!%6Iq0hN&#40;Ac&#94;83UCru%#vVT&#126;zK&amp;aldWJ1&#42;1Phi#hdj2LG8K1m&#126;a
PxtKs9YgbaZbiWtolsK8xIizeJKaYfg$pJL7Jz1p54RTHi!R4&amp;9NVjn6uyjo
xUtBNQIlp&#40;Jd04p$%COM0g&#42;q0yiP$l&#42;&#126;ah&#94;WkKwlqTONQ0#Z9u#FWF!QmueS
</code></pre><p>意思是生成长度为60的10个token，每一行是一个。60可以改为你想要的token长度。默认每次生成10个，如果想要更多个，就多执行几次命令。未来这里会和jwt生成算法进行结合。</p><h2>请求有权限认证的接口</h2><p>当我们配置好了权限接口，请求的时候，就必须使用users中某一个用户的token去访问接口，并且token必须放到约定的地方，比如请求头中，接口才会成功，否则就会返回<code>no&#95;perm&#95;response</code>中的错误信息。</p>
            <p class="text-left text-muted">2020-02-05 05:58</p>
        </div>
        <div class="container">
            <div class="row mt-4">
                <div class="col-6 text-left"><a href="/p/2020/2/5/json5/">上一篇: Json5 语法说明</a></div>
                <div class="col-6 text-right"><a href="/p/2020/1/29/Panda-api字段说明/">下一篇:Panda-api字段说明</a></div>
            </div>
        </div>

        <button class="btn btn-link m-menu-toggle d-md-none fixed-top collapsed" type="button" data-toggle="collapse" data-target="#m-menu" aria-controls="m-menu" aria-expanded="false" aria-label="Toggle docs navigation"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" width="30" height="30" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M4 7h22M4 15h22M4 23h22"></path></svg>
        </button>
        <ul class="nav flex-column collapse fixed-top site-menu d-md-block" id="m-menu">
            <li class="nav-item">
                <a class="nav-link" href="/">首页</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/list/">所有文章</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/about-me/">关于我</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="https://github.com/arlicle">Github</a>
          </li>
        </ul>

        
    <div class="container mt-5">
        <h3>留言</h3>
        <div id="commentApp"></div>
    </div>
    <script>
        var AL_configs = {
            "post_id":"/p/2020/2/2/Panda-api接口权限配置说明/",
            "appid":"847e226e8a46f64045d45312245a68ba1368a564"
        };
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://comment.debugmyself.com/sc.js";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>


        <footer class="footer mt-5 pb-2">
        <div class="container text-center">
          
          <p><span class="text-black-50">Powered by <a href="https://github.com/arlicle/ablog">ablog</a> © 2019 叫兽</span></p>
          <p><span class="text-black-50"><a href="http://www.beian.miit.gov.cn/">滇ICP备10201832号-3</a></span></p>
          
        </div>
        </footer>
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
        <script src="/js/prism.js"></script>
        <script>
        $(function () {
            $('[data-toggle="tooltip"]').tooltip();
        })
        </script>
        <script type="text/x-mathjax-config">
        MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}, displayAlign: "left",scale: 180});
        </script>
        <script type="text/javascript" async
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_SVG" async>
        </script>
  </body>
</html>